package service

import (
	"context"
	"fmt"
	"software/global"
	"software/models/mongo"
	"time"

	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/bson/primitive"
)

// AuditComment 审核评论
func AuditComment(ctx context.Context, commentID primitive.ObjectID) (bool, string, error) {
	// 获取评论详情
	comment, err := GetCommentDetail(ctx, commentID)
	if err != nil {
		return false, "", fmt.Errorf("获取评论详情失败: %v", err)
	}

	// 获取评论内容
	content, ok := comment["content"].(string)
	if !ok {
		return false, "", fmt.Errorf("评论内容格式错误")
	}

	// 创建内容审核服务
	contentAuditService := ContentAuditService{}

	// 审核内容
	passed, label, err := contentAuditService.AuditText(content)
	if err != nil {
		return false, "", fmt.Errorf("评论内容审核失败: %v", err)
	}

	// 更新评论状态
	var status int
	if passed {
		status = 1 // 正常
	} else {
		status = 2 // 封禁
	}

	// 更新评论状态
	err = UpdateCommentStatus(ctx, commentID, int8(status))
	if err != nil {
		return passed, label, fmt.Errorf("更新评论状态失败: %v", err)
	}

	return passed, label, nil
}

// GetCommentDetail 获取评论详情
func GetCommentDetail(ctx context.Context, commentID primitive.ObjectID) (map[string]interface{}, error) {
	// 获取MongoDB集合
	collection := global.MongoDBC.Collection(mongo.Comment{}.CollectionName())

	// 构建查询条件
	filter := bson.M{"_id": commentID}

	// 执行查询
	var doc bson.M
	err := collection.FindOne(ctx, filter).Decode(&doc)
	if err != nil {
		global.Log.Errorf("查询评论失败: %v", err)
		return nil, fmt.Errorf("评论不存在")
	}

	// 构建返回数据
	commentMap := map[string]interface{}{
		"id":          doc["_id"],
		"post_id":     doc["post_id"],
		"user_id":     doc["user_id"],
		"content":     getStringValue(doc, "content", ""),
		"like_count":  int(getInt32Value(doc, "like_count", 0)),
		"status":      getInt8Value(doc, "status", 1),
		"create_time": getTimeValue(doc, "create_time", time.Now()),
	}

	return commentMap, nil
}

// UpdateCommentStatus 更新评论状态
func UpdateCommentStatus(ctx context.Context, commentID primitive.ObjectID, status int8) error {
	// 验证状态值是否有效
	if status < 0 || status > 3 {
		return fmt.Errorf("无效的状态值: %d，状态值必须是 0(审核中)、1(正常)、2(已封禁)或3(已删除)", status)
	}

	global.Log.Infof("更新评论状态，ID: %s，新状态: %d", commentID.Hex(), status)

	// 获取MongoDB集合
	collection := global.MongoDBC.Collection(mongo.Comment{}.CollectionName())

	// 构建更新条件和更新内容
	filter := bson.M{"_id": commentID}
	update := bson.M{
		"$set": bson.M{
			"status": status,
		},
	}

	// 执行更新操作
	updateResult, err := collection.UpdateOne(ctx, filter, update)
	if err != nil {
		global.Log.Errorf("更新评论状态失败: %v", err)
		return fmt.Errorf("更新评论状态失败: %v", err)
	}

	// 检查是否有文档被更新
	if updateResult.MatchedCount == 0 {
		global.Log.Warnf("未找到ID为 %s 的评论", commentID.Hex())
		return fmt.Errorf("未找到ID为 %s 的评论", commentID.Hex())
	}

	global.Log.Infof("评论状态更新成功，ID: %s，新状态: %d，匹配数: %d，修改数: %d",
		commentID.Hex(), status, updateResult.MatchedCount, updateResult.ModifiedCount)
	return nil
}

// 辅助函数：从bson.M中获取int8值
func getInt8Value(doc bson.M, key string, defaultValue int8) int8 {
	if val, ok := doc[key]; ok {
		switch v := val.(type) {
		case int8:
			return v
		case int:
			return int8(v)
		case int32:
			return int8(v)
		case int64:
			return int8(v)
		case float64:
			return int8(v)
		}
	}
	return defaultValue
}
